package tools

import (
	"fmt"
	"math"
	"regexp"
	"strconv"
	"strings"
	"unicode/utf8"
)

// StrToFloat64 最常用的集中类型肯定是 string,float64,int 浮点必须是float64，int可以用int()转换
// 字符串转换为float64
func StrToFloat64(str string) float64 {
	var result float64
	result, _ = strconv.ParseFloat(str, 64)
	return result
}

// StrToInt 字符串转换为int
func StrToInt(str string) int {
	var result int
	result, _ = strconv.Atoi(str)
	return result
}

// Float64ToStr float64转换为字符串
func Float64ToStr(f float64) string {
	return strconv.FormatFloat(f, 'f', -1, 64)
}

// IntToStr int转换为字符串
func IntToStr(i int) string {
	return strconv.Itoa(i)
}

// 对float64四舍五入取整
func Round(f float64) int {
	return int(f + 0.5)
}

// 计算[]float64的最大值和最小值和对应的索引
func MaxAndMinAndIndex(arr []float64) (max, min float64, maxIndex, minIndex int) {
	max = arr[0]
	min = arr[0]
	maxIndex = 0
	minIndex = 0
	for i, v := range arr {
		if v > max {
			max = v
			maxIndex = i
		}
		if v < min {
			min = v
			minIndex = i
		}
	}
	return max, min, maxIndex, minIndex
}

// float64保留n位小数
func Float64ToFixed(f float64, n int) float64 {
	return math.Trunc(f*math.Pow10(n)+0.5) / math.Pow10(n)
}

func Float64ToFixedStr(f float64, n int) string {
	if f == 0 {
		return ""
	}
	formatted := fmt.Sprintf("%."+strconv.Itoa(n)+"f", f)
	return formatted
}

// 获取字符串中的数字
func GetNum(str string) []int {
	var result []int
	for _, v := range str {
		if v >= 48 && v <= 57 {
			result = append(result, int(v-48))
		}
	}
	return result
}

// 获取字符串中的数字，包括小数
func GetNumFloat(str string) []float64 {
	var result []float64
	for _, v := range str {
		if v >= 48 && v <= 57 {
			result = append(result, float64(v-48))
		}
	}
	return result
}

// 计算[]florat64平均数
func Average(arr []float64) float64 {
	var sum float64
	for _, v := range arr {
		sum += v
	}
	return sum / float64(len(arr))
}

func GetNumFloat64(str string) (matches []float64) {
	pattern := `\d+\.\d+`

	re := regexp.MustCompile(pattern)
	//matches := re.FindAllString(str, -1)
	matchesStr := re.FindAllString(str, -1)
	for _, v := range matchesStr {
		matches = append(matches, StrToFloat64(v))
	}
	return matches

	//if len(matches) >= 2 {
	//	fmt.Println(matches[0])
	//	fmt.Println(matches[1])
	//} else {
	//	fmt.Println("未找到匹配的数字")
	//}
}

// MaxFloat64 求数组中的最大值
func MaxFloat64(arr []float64) float64 {
	var mmm float64
	mmm = arr[0]
	for _, v := range arr {
		if v > mmm {
			mmm = v
		}
	}
	return mmm
}

// TrimSpace 去除字符串中的空格
func TrimSpace(str string) string {
	return strings.Replace(str, " ", "", -1)
}

// SliceChinese 对中文字符进行切片
func SliceChinese(str string, startIndex, endIndex int) string {
	runes := []rune(str)
	// 计算切片的起始和结束字节索引
	startByteIndex := utf8.RuneCountInString(str[:startIndex])
	endByteIndex := utf8.RuneCountInString(str[:endIndex])
	// 对切片进行操作
	slicedRunes := runes[startByteIndex:endByteIndex]
	// 将切片转换回字符串
	slicedStr := string(slicedRunes)
	return slicedStr
}

// 字符串全部转为小写
func StrToLower(str string) string {
	return strings.ToLower(str)
}
